import { Entity, Column, Index } from "typeorm";
import { BaseEntity } from "@/common/entities/base.entity";

/**
 * 用户事件实体
 * 用于存储用户行为事件数据，记录用户在页面上的各种交互行为
 */
@Entity("user_events")
export class UserEventEntity extends BaseEntity {
  /**
   * 用户ID
   * 触发事件的用户唯一标识，可为空表示未登录用户
   */
  @Column({ type: "varchar", length: 64, nullable: true, comment: "用户ID" })
  @Index("idx_user_id")
  userId: string;

  /**
   * 事件类型
   * 用户行为的类型，如：click(点击)、dblclick(双击)、scroll(滚动)、input(输入)、submit(提交)等
   */
  @Column({ type: "varchar", length: 50, comment: "事件类型" })
  eventType: string;

  /**
   * 元素ID
   * 触发事件的HTML元素ID属性值，用于精确定位交互元素
   */
  @Column({ type: "varchar", length: 255, nullable: true, comment: "元素ID" })
  elementId: string;

  /**
   * 元素类名
   * 触发事件的HTML元素class属性值，用于分析用户交互的组件类型
   */
  @Column({ type: "varchar", length: 255, nullable: true, comment: "元素类名" })
  elementClass: string;

  /**
   * 元素文本内容
   * 触发事件的HTML元素的文本内容，如按钮文字、链接文本等
   */
  @Column({ type: "varchar", length: 255, nullable: true, comment: "元素文本内容" })
  elementText: string;

  /**
   * 页面URL
   * 事件发生时所在的页面地址
   */
  @Column({ type: "varchar", length: 500, nullable: true, comment: "页面URL" })
  pageUrl: string;

  /**
   * 事件数据
   * 事件的附加数据，JSON格式存储，包含事件的具体信息如鼠标位置、输入值等
   */
  @Column({ type: "text", nullable: true, comment: "事件附加数据(JSON格式)" })
  eventData: string;

  /**
   * 浏览器类型
   * 用户使用的浏览器名称和版本，如：Chrome/91.0.4472.124
   */
  @Column({ type: "varchar", length: 50, nullable: true, comment: "浏览器类型" })
  browser: string;

  /**
   * 操作系统
   * 用户设备的操作系统信息，如：Windows 10, macOS 11.2.3
   */
  @Column({ type: "varchar", length: 50, nullable: true, comment: "操作系统" })
  os: string;

  /**
   * IP地址
   * 用户的IP地址，用于地理位置分析
   */
  @Column({ type: "varchar", length: 45, nullable: true, comment: "IP地址" })
  ipAddress: string;

  /**
   * 用户代理字符串
   * 完整的User-Agent字符串，包含设备、浏览器、操作系统等详细信息
   */
  @Column({ type: "text", nullable: true, comment: "用户代理字符串" })
  userAgent: string;

  /**
   * 事件发生时间
   * 用户行为事件实际发生的时间
   */
  @Column({ type: "datetime", nullable: true, comment: "事件发生时间" })
  eventTime: Date;
}